<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1. Symbol.haslnstance  当其他对象使用 instanceof 运算符，判断是否为该对象的实例时，会调用这个方法
    class Person {
      static [Symbol.hasInstance](param) {
        console.log(param);
        console.log("检测类型");
      }
    }
    let o = {}
    console.log(o instanceof Person);

    // 2. Symbol.isConcatSpreadable   对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值，表示该对象用于 Array.prototype.concat()时，是否可以展开
    let arr = [1, 2, 3]
    let arr2 = [4, 5, 6]
    console.log(arr.concat(arr2));    // [1,2,3,4,5,6]       默认为true，合并为一个数组
    arr2[Symbol.isConcatSpreadable] = false     // 设置一下
    console.log(arr.concat(arr2));    // [1,2,3,[4,5,6]]      arr2不可以被合并

    // 3. Symbol.unscopables    该对象指定了使用 with 关键字时，哪些属性会被 with环境排除。
     

    // 4. Symbol.match    当执行 str.match(myObject）时，如果该属性存在，会调用它，返回该方法的返回值。


    // 5. Symbol.replace     当该对象被 str.replace(myObject)方法调用时，会返回该方法的返回值。

    // 6. Symbol.search     当该对象被 str. search (myObject)方法调用时，会返回该方法的返回值。

    // 7. Symbol.split   当该对象被 str. split(myObject)方法调用时，会返回该方法的返回值。

    // 8. Symbol.iterator    对象进行 for..of 循环时，会调用 Symbol.iterator 方法,返回该对象的默认遍历器

    // 9. Symbol.toPrimitive    该对象被转为原始类型的值时，会调用这个方法，返回该对象对应的原始类型值。

    // 10. Symbol. toStringTag    在该对象上面调用 toString 方法时，返回该方法的返回值

    // 11. Symbol.species       创建衍生对象时，会使用该属性

  </script>
</body>

</html>